package org.uca.dss.curso1011.grupo9;

import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso1011.grupo9.interfazExtendido.Itinerario;

/**
 * Implementación de las interfaces InterfazListados de la interfaz normal y la extendida
 * Delega en operaciones del gestor de reservas y gestor de viajes
 * @author eldruin
 */
public class Listados implements org.uca.dss.curso1011.grupo9.interfazExtendido.InterfazListados, org.uca.dss.curso1011.grupo9.interfaz.InterfazListados{
    private GestorViajes gestor_viajes;
    private GestorReservas gestor_reservas;

    /**
     * Constructor
     * @param gestor_viajes
     * @param gestor_reservas
     */
    public Listados(GestorViajes gestor_viajes, GestorReservas gestor_reservas)
    {
        this.gestor_viajes = gestor_viajes;
        this.gestor_reservas = gestor_reservas;
    }

    public static void init() throws Exception {
    }

    @Override
    public List<Itinerario> getItinerariosEntre(String origen, String destino, LocalDate fechaSalida, LocalTime horaSalida, LocalTime horaLlegada) {
        List<Itinerario> itinerarios = null;
        List<Itinerario> itinerarios_resultado = new ArrayList();
        itinerarios = gestor_viajes.getItinerariosEntre(origen, destino, fechaSalida, horaSalida, horaLlegada);

        //Quitamos las horas cuando no haya asientos.
        for(Itinerario it : itinerarios)
        {
            Viaje v = gestor_viajes.buscarViaje(origen, destino, fechaSalida, horaSalida);

            if (gestor_reservas.plazasLibres(v) > 0)
                itinerarios_resultado.add(it);
        }

        return itinerarios_resultado;
    }

    @Override
    public List<Itinerario> getItinerarios(String origen, String destino, LocalDate fechaSalida) {
        List<Itinerario> itinerarios = null;
        List<Itinerario> itinerarios_resultado = new ArrayList();
        itinerarios = gestor_viajes.getItinerarios(origen, destino, fechaSalida);

        //Quitamos las horas cuando no haya asientos.
        for(Itinerario it : itinerarios)
        {
            Viaje v = gestor_viajes.buscarViaje(origen, destino, fechaSalida, it.get(0).getHoraSalida());

            if (gestor_reservas.plazasLibres(v) > 0)
                itinerarios_resultado.add(it);
        }

        return itinerarios_resultado;
    }

    @Override
    public List<LocalTime> getHorarios(String origen, String destino, LocalDate fecha) {
        List<LocalTime> horas = gestor_viajes.getHorarios(origen, destino, fecha);
        List<LocalTime> horas_resultado = new ArrayList<LocalTime>();
        //Quitamos las horas cuando no haya asientos.
        for(LocalTime hora : horas)
        {
            Viaje v = gestor_viajes.buscarViaje(origen, destino, fecha, hora);

            if (gestor_reservas.plazasLibres(v) > 0)
                horas_resultado.add(hora);
        }
        return horas_resultado;
    }

}
